package Tree.levelOrder;

import Tree.TreeNode;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 116.填充每个节点的下一个右侧节点指针
 * 给定一个 完美二叉树 ，其所有叶子节点都在同一层，每个父节点都有两个子节点。二叉树定义如下：
 * struct Node {
 *   int val;
 *   Node *left;
 *   Node *right;
 *   Node *next;
 * }
 * 填充它的每个 next 指针，让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点，则将 next 指针设置为 NULL。
 * 初始状态下，所有 next 指针都被设置为 NULL。
 */
public class connect {
    //注意力扣上是Node，这里为了避免与之前的重复，所以定义成了Nodes
    public Nodes connect(Nodes root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if (root == null) {
            return null;
        }
        Queue<Nodes> queue = new LinkedList<>();
        queue.add(root);
        int level = 1;
        while (!queue.isEmpty()) {
            level = queue.size();
            for (int i = 0; i < level; i++) {
                Nodes node = queue.poll();
                if (i == level - 1) {
                    node.next = null;
                } else {
                    node.next = queue.peek();
                }

                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
        }
        return root;
    }
}

class Nodes {
    public int val;
    public Nodes left;
    public Nodes right;
    public Nodes next;

    public Nodes() {
    }

    public Nodes(int _val) {
        val = _val;
    }

    public Nodes(int _val, Nodes _left, Nodes _right, Nodes _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};

